home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / boss02.c next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  158 lines

  1. /* 直進してばらまき弾(弾消しあり) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14. #define PALET_MAIN    0x0300
  15.  
  16. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  17.  
  18. static short EnemyMoveBoss02 (ENEMY *);
  19. static void EnemyTiniBoss02 (ENEMY *);
  20.  
  21.  
  22. void EnemyInitBoss02 (ENEMY * p)
  23. {
  24.     p->vx = 0;
  25.     p->vy = 4 * 65536;
  26.     p->hit_px = 32;
  27.     p->hit_py = 8;
  28.     p->hit_sx = 32;
  29.     p->hit_sy = 8;
  30.     p->hit_cx = 8;
  31.     p->damage = 0;
  32.     p->flash = 0;
  33.     p->hp = 200;
  34.     p->pt = obj_coverf;
  35.     p->seq = 0;
  36.     p->angle = p->x + p->y;    /* 乱数 */
  37.     p->func_enemy_move = EnemyMoveBoss02;
  38.     p->func_enemy_tini = EnemyTiniBoss02;
  39.     p->core_pt = sp_core01;
  40.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS_CORE;
  41.  
  42.     entry_control += ENTRY_CONTROL_ADD;
  43. }
  44.  
  45.  
  46.  
  47. static short EnemyMoveBoss02 (ENEMY * p)
  48. {
  49.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  50.     p->x = (p->lx += p->vx) >> 16;
  51.     p->y = (p->ly += p->vy) >> 16;
  52.  
  53.     switch (p->seq) {
  54.     case 0:
  55.         p->vy -= 4096;
  56.         if (p->vy < 32768) {
  57.             p->vy = 32768;
  58.             p->seq++;
  59.             p->m_work = 0;
  60.         }
  61.         break;
  62.     case 1:        /* カバー開ける */
  63.         p->m_work++;
  64.         p->pt++;
  65.         if (p->m_work > 10) {
  66.             SoundSetSE (SE_LOCK);    /* 「がちゃん」という効果音を鳴らす */
  67.             p->seq++;
  68.             p->s_work = 0;
  69.         }
  70.         break;
  71.     case 2:        /* ばらまき弾 */
  72.         if (p->s_work++ > 1) {
  73.             p->s_work = 0;
  74.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 5, rndtable[p->angle++] & 0xfe, 4);
  75.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, 5, rndtable[p->angle++] & 0xfe, 4);
  76.             SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  77.         }
  78.         /* ある程度進んだらコアを赤に */
  79.         if ((p->core_info == (PALET_CORE_BLUE | PRIORITY_BOSS_CORE)) && (SHORT_LY > 128))
  80.             p->core_info = PALET_CORE_RED | PRIORITY_BOSS_CORE;
  81.         if (SHORT_LY > 192) {
  82.             p->seq++;
  83.             p->m_work = 0;
  84.         }
  85.         break;
  86.     case 3:        /* カバー閉じる */
  87.         p->m_work++;
  88.         p->pt--;
  89.         if (p->m_work > 10) {
  90.             SoundSetSE (SE_LOCK);    /* 「がちゃん」という効果音を鳴らす */
  91.             p->seq++;
  92.         }
  93.         break;
  94.     case 4:
  95.         if (SHORT_VY < 4)
  96.             p->vy += 4096;
  97.         /* 画面外に出たら消去 */
  98.         if (SHORT_LY > 256 + 32)
  99.             return (-1);    /* 消去 */
  100.         break;
  101.     case 5:
  102.         /* 画面外に出たら消去 */
  103.         if (SHORT_LY > 256 + 32)
  104.             return (-1);    /* 消去 */
  105.         break;
  106.     }
  107.  
  108.     /* 自機ショットに当たった時の処理 */
  109.     if (p->damage) {
  110.         if (p->damage_core) {
  111.             SoundSetSE (SE_CORE_DAMAGE);    /* 効果音 */
  112.             p->info = PALET_RED | PRIORITY_BOSS;
  113.             p->damage_core = 0;
  114.         } else {
  115.             SoundSetSE (SE_DAMAGE);    /* 効果音 */
  116.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  117.         }
  118.         if ((p->hp -= p->damage) <= 0) {
  119.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  120.             SoundSetSE (SE_EXPL_M);    /* 爆発音 */
  121.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE))
  122.                 EffectInit (EFFECT_POINTS_RED, POINTS_1500, p->x, p->y);
  123.             else
  124.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_1000, p->x, p->y);
  125.             if (disp_level == DISP_LEVEL_HIGH)
  126.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  127.             if (!eshot_erase)
  128.                 eshot_erase = ESHOT_ERASE;    /* 弾消し */
  129.             return (-1);    /* 消去 */
  130.         }
  131.         p->damage = 0;
  132.         p->flash = TIMER_FLASH_DAMAGE;
  133.     } else {
  134.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) {
  135.             p->info = PALET_RED | PRIORITY_BOSS;
  136.             if (p->flash > TIMER_FLASH_NORMAL)
  137.                 p->flash = 0;
  138.         } else {
  139.             p->info = PALET_MAIN | PRIORITY_BOSS;
  140.         }
  141.     }
  142.  
  143.     xobj_set_st (p);
  144.  
  145.     /* コアの表示 */
  146.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  147.     p->core_y = p->y - 8;
  148.     xsp_set_st (&(p->core_x));
  149.  
  150.     return (0);
  151. }
  152.  
  153.  
  154. static void EnemyTiniBoss02 (ENEMY * p)
  155. {
  156.     entry_control -= ENTRY_CONTROL_ADD;
  157. }
  158.